Support distributed virtual router (DVR) at kubernetes

Change-Id: I6dfa1ad0d2161443e37fa80901d5ababbec6f74e
diff --git a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sApiConfigCodecTest.java b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sApiConfigCodecTest.java
index b5deb38..bf5d337 100644
--- a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sApiConfigCodecTest.java
+++ b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sApiConfigCodecTest.java
@@ -39,6 +39,7 @@
 import java.util.Set;
 
 import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertTrue;
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
@@ -103,6 +104,7 @@
                 .clientCertData("clientCertData")
                 .clientKeyData("clientKeyData")
                 .infos(ImmutableSet.of(info))
+                .dvr(true)
                 .build();
 
         ObjectNode configJson = k8sApiConfigCodec.encode(config, context);
@@ -129,6 +131,7 @@
         assertEquals("caCertData", config.caCertData());
         assertEquals("clientCertData", config.clientCertData());
         assertEquals("clientKeyData", config.clientKeyData());
+        assertTrue(config.dvr());
 
         Set<HostNodesInfo> infos = config.infos();
         assertEquals(1, infos.size());
diff --git a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sApiConfigJsonMatcher.java b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sApiConfigJsonMatcher.java
index 7ec3866..22c7117 100644
--- a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sApiConfigJsonMatcher.java
+++ b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sApiConfigJsonMatcher.java
@@ -41,6 +41,7 @@
     private static final String CLIENT_CERT_DATA = "clientCertData";
     private static final String CLIENT_KEY_DATA = "clientKeyData";
     private static final String HOST_NODES_INFO = "hostNodesInfo";
+    private static final String DVR = "dvr";
 
     private K8sApiConfigJsonMatcher(K8sApiConfig k8sApiConfig) {
         this.k8sApiConfig = k8sApiConfig;
@@ -117,6 +118,16 @@
             }
         }
 
+        // check DVR
+        JsonNode jsonDvr = jsonNode.get(DVR);
+        boolean dvr = k8sApiConfig.dvr();
+        if (jsonDvr != null) {
+            if (jsonDvr.asBoolean() != dvr) {
+                description.appendText("DVR was " + jsonDvr);
+                return false;
+            }
+        }
+
         // check token
         JsonNode jsonToken = jsonNode.get(TOKEN);
         String token = k8sApiConfig.token();
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 c6861be..6b2689d 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
@@ -21,6 +21,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
 import org.onosproject.codec.impl.CodecManager;
@@ -89,6 +90,7 @@
                 .extIntf("eth1")
                 .extBridgeIp(IpAddress.valueOf("10.10.10.5"))
                 .extGatewayIp(IpAddress.valueOf("10.10.10.1"))
+                .extGatewayMac(MacAddress.valueOf("FF:FF:FF:FF:FF:FF"))
                 .build();
 
         ObjectNode nodeJson = k8sNodeCodec.encode(node, context);
@@ -114,6 +116,7 @@
         assertEquals("eth1", node.extIntf());
         assertEquals("172.16.130.5", node.extBridgeIp().toString());
         assertEquals("172.16.130.1", node.extGatewayIp().toString());
+        assertEquals("FF:FF:FF:FF:FF:FF", node.extGatewayMac().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 816ca76..71c5ca9 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
@@ -19,6 +19,7 @@
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeDiagnosingMatcher;
 import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
 import org.onosproject.k8snode.api.K8sNode;
 
 /**
@@ -39,6 +40,7 @@
     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 EXTERNAL_GATEWAY_MAC = "externalGatewayMac";
 
     private K8sNodeJsonMatcher(K8sNode node) {
         this.node = node;
@@ -147,6 +149,16 @@
             }
         }
 
+        // check external gateway MAC
+        JsonNode jsonExtGatewayMac = jsonNode.get(EXTERNAL_GATEWAY_MAC);
+        if (jsonExtGatewayMac != null) {
+            MacAddress extGatewayMac = node.extGatewayMac();
+            if (!jsonExtGatewayMac.asText().equals(extGatewayMac.toString())) {
+                description.appendText("External gateway MAC was " + jsonExtGatewayMac.asText());
+                return false;
+            }
+        }
+
         return true;
     }