Create/remove tenant bridge per tenant network at kubevirt app
Change-Id: I43ccf21db561edb9c51c2d8017dc4f614c5f0a4d
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java
index c0afe45..599a615 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java
@@ -51,6 +51,11 @@
public static final int FORWARDING_TABLE = 80;
public static final int ERROR_TABLE = 100;
+ // tenant integration bridge flow table index
+ public static final int TENANT_INBOUND_TABLE = 0;
+ public static final int TENANT_DHCP_TABLE = 5;
+ public static final int TENANT_FORWARDING_TABLE = 80;
+
// flow rule priority
public static final int PRIORITY_SWITCHING_RULE = 30000;
public static final int PRIORITY_DHCP_RULE = 42000;
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java
index 79c535d..6c0bf8b 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java
@@ -16,8 +16,10 @@
package org.onosproject.kubevirtnetworking.api;
import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
import com.google.common.collect.ImmutableSet;
import org.onlab.packet.IpAddress;
+import org.onosproject.net.DeviceId;
import java.util.HashSet;
import java.util.Objects;
@@ -25,6 +27,9 @@
import static com.google.common.base.Preconditions.checkArgument;
import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.FLAT;
+import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GENEVE;
+import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GRE;
+import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.VXLAN;
/**
* Default implementation class of kubevirt network.
@@ -32,6 +37,8 @@
public final class DefaultKubevirtNetwork implements KubevirtNetwork {
private static final String NOT_NULL_MSG = "Network % cannot be null";
+ private static final String TENANT_BRIDGE_PREFIX = "br-int-";
+ private static final String OF_PREFIX = "of:";
private final String networkId;
private final Type type;
@@ -133,6 +140,25 @@
}
@Override
+ public String tenantBridgeName() {
+ if (type == VXLAN || type == GRE || type == GENEVE) {
+ return TENANT_BRIDGE_PREFIX + segmentIdHex(segmentId);
+ }
+ return null;
+ }
+
+ @Override
+ public DeviceId tenantDeviceId(String hostname) {
+ if (type == VXLAN || type == GRE || type == GENEVE) {
+ String dpid = genDpidFromName(tenantBridgeName() + "-" + hostname);
+ if (dpid != null) {
+ return DeviceId.deviceId(dpid);
+ }
+ }
+ return null;
+ }
+
+ @Override
public boolean equals(Object o) {
if (this == o) {
return true;
@@ -171,6 +197,20 @@
.toString();
}
+ private String segmentIdHex(String segIdStr) {
+ int segId = Integer.parseInt(segIdStr);
+ return String.format("%06x", segId).toLowerCase();
+ }
+
+ private String genDpidFromName(String name) {
+ if (name != null) {
+ String hexString = Integer.toHexString(name.hashCode());
+ return OF_PREFIX + Strings.padStart(hexString, 16, '0');
+ }
+
+ return null;
+ }
+
/**
* Returns new builder instance.
*
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java
index 97b2286..3c99544 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java
@@ -16,6 +16,7 @@
package org.onosproject.kubevirtnetworking.api;
import org.onlab.packet.IpAddress;
+import org.onosproject.net.DeviceId;
import java.util.Set;
@@ -121,6 +122,22 @@
Set<IpAddress> dnses();
/**
+ * Returns the tenant integration bridge name in case the bridge type
+ * is VXLAN/GRE/GENEVE.
+ *
+ * @return tunnel bridge name
+ */
+ String tenantBridgeName();
+
+ /**
+ * Returns the tenant integration bridge's device identifier.
+ *
+ * @param hostname kubevirt node hostname
+ * @return device identifier
+ */
+ DeviceId tenantDeviceId(String hostname);
+
+ /**
* Builder of new network.
*/
interface Builder {