Support distributed virtual router (DVR) at kubernetes
Change-Id: I6dfa1ad0d2161443e37fa80901d5ababbec6f74e
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sApiConfigCodec.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sApiConfigCodec.java
index 5b8c05e..9b90c94 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sApiConfigCodec.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sApiConfigCodec.java
@@ -57,6 +57,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 static final String MISSING_MESSAGE = " is required in K8sApiConfig";
@@ -69,7 +70,8 @@
.put(SCHEME, entity.scheme().name())
.put(IP_ADDRESS, entity.ipAddress().toString())
.put(PORT, entity.port())
- .put(STATE, entity.state().name());
+ .put(STATE, entity.state().name())
+ .put(DVR, entity.dvr());
if (entity.scheme() == HTTPS) {
node.put(CA_CERT_DATA, entity.caCertData())
@@ -159,6 +161,11 @@
.port(port)
.state(DISCONNECTED);
+ JsonNode dvrJson = json.get(DVR);
+ if (dvrJson != null) {
+ builder.dvr(dvrJson.asBoolean());
+ }
+
JsonNode tokenJson = json.get(TOKEN);
JsonNode caCertDataJson = json.get(CA_CERT_DATA);
JsonNode clientCertDataJson = json.get(CLIENT_CERT_DATA);
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 8793c46..4cc6609 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
@@ -19,6 +19,7 @@
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.commons.lang.StringUtils;
import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
import org.onosproject.k8snode.api.DefaultK8sNode;
@@ -54,6 +55,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 static final String MISSING_MESSAGE = " is required in K8sNode";
@@ -101,6 +103,10 @@
result.put(EXTERNAL_GATEWAY_IP, node.extGatewayIp().toString());
}
+ if (node.extGatewayMac() != null) {
+ result.put(EXTERNAL_GATEWAY_MAC, node.extGatewayMac().toString());
+ }
+
return result;
}
@@ -176,6 +182,11 @@
nodeBuilder.extGatewayIp(IpAddress.valueOf(extGatewayIpJson.asText()));
}
+ JsonNode extGatewayMacJson = json.get(EXTERNAL_GATEWAY_MAC);
+ if (extGatewayMacJson != null) {
+ nodeBuilder.extGatewayMac(MacAddress.valueOf(extGatewayMacJson.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 c188871..342787c 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
@@ -20,6 +20,7 @@
import io.fabric8.kubernetes.api.model.NodeAddress;
import io.fabric8.kubernetes.client.KubernetesClient;
import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
import org.onosproject.cluster.ClusterService;
import org.onosproject.cluster.LeadershipService;
import org.onosproject.cluster.NodeId;
@@ -54,6 +55,7 @@
import static java.util.concurrent.Executors.newSingleThreadExecutor;
import static org.onlab.util.Tools.groupedThreads;
import static org.onosproject.k8snode.api.Constants.DEFAULT_CLUSTER_NAME;
+import static org.onosproject.k8snode.api.Constants.DEFAULT_EXTERNAL_GATEWAY_MAC;
import static org.onosproject.k8snode.api.Constants.EXTERNAL_TO_ROUTER;
import static org.onosproject.k8snode.api.K8sApiConfig.Mode.PASSTHROUGH;
import static org.onosproject.k8snode.api.K8sNode.Type.MASTER;
@@ -243,7 +245,7 @@
extBridgeIpStr = annots.get(EXT_BRIDGE_IP);
}
- return DefaultK8sNode.builder()
+ K8sNode.Builder builder = DefaultK8sNode.builder()
.clusterName(DEFAULT_CLUSTER_NAME)
.hostname(hostname)
.managementIp(managementIp)
@@ -255,8 +257,13 @@
.mode(config.mode())
.extBridgeIp(IpAddress.valueOf(extBridgeIpStr))
.extGatewayIp(IpAddress.valueOf(extGatewayIpStr))
- .podCidr(node.getSpec().getPodCIDR())
- .build();
+ .podCidr(node.getSpec().getPodCIDR());
+
+ if (config.dvr()) {
+ builder.extGatewayMac(MacAddress.valueOf(DEFAULT_EXTERNAL_GATEWAY_MAC));
+ }
+
+ return builder.build();
}
/**
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;
}
diff --git a/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/codec/K8sApiConfig.json b/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/codec/K8sApiConfig.json
index 70639b9..8fb9242 100644
--- a/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/codec/K8sApiConfig.json
+++ b/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/codec/K8sApiConfig.json
@@ -17,5 +17,6 @@
"master", "worker"
]
}
- ]
+ ],
+ "dvr": true
}
\ No newline at end of file
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 495dfee..fb01b77 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
@@ -9,5 +9,6 @@
"externalBridge": "of:00000000000000b1",
"externalInterface": "eth1",
"externalBridgeIp": "172.16.130.5",
- "externalGatewayIp": "172.16.130.1"
+ "externalGatewayIp": "172.16.130.1",
+ "externalGatewayMac": "FF:FF:FF:FF:FF:FF"
}
\ No newline at end of file