Implement floating Ip capability in kubevirt networking app.
Change-Id: Iad9358b321dd0b46a2418c8c2d78ffd91c605e28
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
index e1a26d7..e061495 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
@@ -34,6 +34,7 @@
import org.onosproject.cfg.ConfigProperty;
import org.onosproject.kubevirtnetworking.api.DefaultKubevirtPort;
import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
+import org.onosproject.kubevirtnetworking.api.KubevirtNetworkService;
import org.onosproject.kubevirtnetworking.api.KubevirtPort;
import org.onosproject.kubevirtnetworking.api.KubevirtRouter;
import org.onosproject.kubevirtnetworking.api.KubevirtRouterService;
@@ -60,7 +61,6 @@
import static org.onosproject.kubevirtnetworking.api.Constants.TUNNEL_TO_TENANT_PREFIX;
import static org.onosproject.kubevirtnode.api.KubevirtNode.Type.GATEWAY;
-import static org.onosproject.net.AnnotationKeys.PORT_MAC;
import static org.onosproject.net.AnnotationKeys.PORT_NAME;
/**
@@ -318,11 +318,12 @@
/**
* Obtains the kubevirt port from kubevirt POD.
*
+ * @param nodeService kubevirt node service
* @param networks set of existing kubevirt networks
* @param pod kubevirt POD
* @return kubevirt ports attached to the POD
*/
- public static Set<KubevirtPort> getPorts(Set<KubevirtNetwork> networks, Pod pod) {
+ public static Set<KubevirtPort> getPorts(KubevirtNodeService nodeService, Set<KubevirtNetwork> networks, Pod pod) {
try {
Map<String, String> annots = pod.getMetadata().getAnnotations();
if (annots == null) {
@@ -338,6 +339,12 @@
if (networkStatusStr == null) {
return ImmutableSet.of();
}
+ KubevirtPort.Builder builder = DefaultKubevirtPort.builder();
+
+ KubevirtNode node = nodeService.node(pod.getSpec().getNodeName());
+ if (node != null) {
+ builder.deviceId(node.intgBridge());
+ }
JSONArray networkStatus = new JSONArray(networkStatusStr);
Set<KubevirtPort> ports = new HashSet<>();
@@ -351,8 +358,7 @@
if (network != null) {
String mac = object.getString(MAC);
- KubevirtPort.Builder builder = DefaultKubevirtPort.builder()
- .macAddress(MacAddress.valueOf(mac))
+ builder.macAddress(MacAddress.valueOf(mac))
.networkId(network.networkId());
if (object.has(IPS)) {
@@ -435,7 +441,7 @@
return "";
}
- private static PortNumber portNumber(DeviceId deviceId, String portName) {
+ public static PortNumber portNumber(DeviceId deviceId, String portName) {
DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
Port port = deviceService.getPorts(deviceId).stream()
.filter(p -> p.isEnabled() &&
@@ -471,12 +477,19 @@
* @param deviceId device Id
* @return mac address of the br-int port
*/
- public static MacAddress getbrIntMacAddress(DeviceService deviceService,
- DeviceId deviceId) {
- return MacAddress.valueOf(deviceService.getPorts(deviceId).stream()
- .filter(port -> Objects.equals(port.annotations().value(PORT_NAME), BR_INT))
- .map(port -> port.annotations().value(PORT_MAC))
- .findAny().orElse(null));
+
+ /**
+ * Returns the mac address of the router.
+ *
+ * @param router kubevirt router
+ * @return macc address of the router
+ */
+ public static MacAddress getRouterMacAddress(KubevirtRouter router) {
+ if (router.mac() == null) {
+ log.warn("Failed to get mac address of router {}", router.name());
+ }
+
+ return router.mac();
}
/**
@@ -535,4 +548,30 @@
.filter(router -> router.internal().contains(kubevirtNetwork.networkId()))
.findAny().orElse(null);
}
+
+ /**
+ * Returns the external patch port number with specified gateway.
+ *
+ * @param deviceService device service
+ * @param gatewayNode gateawy node
+ * @return external patch port number
+ */
+ public static PortNumber externalPatchPortNum(DeviceService deviceService, KubevirtNode gatewayNode) {
+ Port port = deviceService.getPorts(gatewayNode.intgBridge()).stream()
+ .filter(p -> p.isEnabled() &&
+ Objects.equals(p.annotations().value(PORT_NAME), "int-to-gateway"))
+ .findAny().orElse(null);
+
+ return port != null ? port.number() : null;
+ }
+
+ public static KubevirtNetwork getExternalNetworkByRouter(KubevirtNetworkService networkService,
+ KubevirtRouter router) {
+ String networkId = router.external().values().stream().findAny().orElse(null);
+ if (networkId == null) {
+ return null;
+ }
+
+ return networkService.network(networkId);
+ }
}