Support to allocate/release IP address for multiple networks
Change-Id: Ibd9a73fc8675559ed2a1aff47e39759745fad400
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPodPortMapper.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPodPortMapper.java
index a5379e8..9675ca2 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPodPortMapper.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPodPortMapper.java
@@ -46,12 +46,13 @@
import java.util.Map;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.ExecutorService;
import static java.util.concurrent.Executors.newSingleThreadExecutor;
import static org.onlab.util.Tools.groupedThreads;
import static org.onosproject.kubevirtnetworking.api.Constants.KUBEVIRT_NETWORKING_APP_ID;
-import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.getPort;
+import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.getPorts;
import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.k8sClient;
import static org.slf4j.LoggerFactory.getLogger;
@@ -185,14 +186,16 @@
log.error("Failed to reserve IP address", e);
}
- KubevirtPort port = getPort(kubevirtNetworkAdminService.networks(), pod);
- if (port == null) {
+ Set<KubevirtPort> ports = getPorts(kubevirtNetworkAdminService.networks(), pod);
+ if (ports.size() == 0) {
return;
}
- if (kubevirtPortAdminService.port(port.macAddress()) == null) {
- kubevirtPortAdminService.createPort(port);
- }
+ ports.forEach(port -> {
+ if (kubevirtPortAdminService.port(port.macAddress()) == null) {
+ kubevirtPortAdminService.createPort(port);
+ }
+ });
}
private void processPodUpdate(Pod pod) {
@@ -200,56 +203,57 @@
return;
}
- KubevirtPort port = getPort(kubevirtNetworkAdminService.networks(), pod);
- if (port == null) {
+ Set<KubevirtPort> ports = getPorts(kubevirtNetworkAdminService.networks(), pod);
+ if (ports.size() == 0) {
return;
}
- if (kubevirtPortAdminService.port(port.macAddress()) != null) {
- return;
- }
-
- if (port.ipAddress() == null) {
- try {
- IpAddress ip = kubevirtNetworkAdminService.allocateIp(port.networkId());
- port = port.updateIpAddress(ip);
-
- // update the POD annotation to inject the allocated IP address
- String networkStatusStr = pod.getMetadata().getAnnotations().get(NETWORK_STATUS_KEY);
- JSONArray networkStatus = new JSONArray(networkStatusStr);
- for (int i = 0; i < networkStatus.length(); i++) {
- JSONObject object = networkStatus.getJSONObject(i);
- String name = object.getString(NAME);
- KubevirtNetwork jsonNetwork = kubevirtNetworkAdminService.networks().stream()
- .filter(n -> (NETWORK_PREFIX + n.name()).equals(name))
- .findAny().orElse(null);
- if (jsonNetwork != null) {
- JSONArray ipsJson = new JSONArray();
- ipsJson.put(ip.toString());
- object.put(IPS, ipsJson);
- }
- }
- Map<String, String> annots = pod.getMetadata().getAnnotations();
- annots.put(NETWORK_STATUS_KEY, networkStatus.toString(4));
-
- KubernetesClient client = k8sClient(kubevirtApiConfigService);
-
- if (client == null) {
- return;
- }
-
- client.pods().inNamespace(pod.getMetadata().getNamespace())
- .withName(pod.getMetadata().getName())
- .edit(r -> new PodBuilder(r)
- .editMetadata()
- .addToAnnotations(annots)
- .endMetadata().build()
- );
- } catch (Exception e) {
- log.error("Failed to allocate IP address", e);
+ for (KubevirtPort port : ports) {
+ if (kubevirtPortAdminService.port(port.macAddress()) != null) {
+ continue;
}
+
+ if (port.ipAddress() == null) {
+ try {
+ IpAddress ip = kubevirtNetworkAdminService.allocateIp(port.networkId());
+ log.info("IP address {} is allocated from network {}", ip, port.networkId());
+ port = port.updateIpAddress(ip);
+
+ // update the POD annotation to inject the allocated IP address
+ String networkStatusStr = pod.getMetadata().getAnnotations().get(NETWORK_STATUS_KEY);
+ JSONArray networkStatus = new JSONArray(networkStatusStr);
+ for (int i = 0; i < networkStatus.length(); i++) {
+ JSONObject object = networkStatus.getJSONObject(i);
+ String name = object.getString(NAME);
+
+ if (name.equals(NETWORK_PREFIX + port.networkId())) {
+ JSONArray ipsJson = new JSONArray();
+ ipsJson.put(ip.toString());
+ object.put(IPS, ipsJson);
+ }
+ }
+ Map<String, String> annots = pod.getMetadata().getAnnotations();
+ annots.put(NETWORK_STATUS_KEY, networkStatus.toString(4));
+
+ KubernetesClient client = k8sClient(kubevirtApiConfigService);
+
+ if (client == null) {
+ return;
+ }
+
+ client.pods().inNamespace(pod.getMetadata().getNamespace())
+ .withName(pod.getMetadata().getName())
+ .edit(r -> new PodBuilder(r)
+ .editMetadata()
+ .addToAnnotations(annots)
+ .endMetadata().build()
+ );
+ } catch (Exception e) {
+ log.error("Failed to allocate IP address", e);
+ }
+ }
+ kubevirtPortAdminService.createPort(port);
}
- kubevirtPortAdminService.createPort(port);
}
private void processPodDeletion(Pod pod) {
@@ -257,16 +261,18 @@
return;
}
- KubevirtPort port = getPort(kubevirtNetworkAdminService.networks(), pod);
- if (port == null) {
+ Set<KubevirtPort> ports = getPorts(kubevirtNetworkAdminService.networks(), pod);
+ if (ports.size() == 0) {
return;
}
- if (port.ipAddress() != null) {
- kubevirtNetworkAdminService.releaseIp(port.networkId(), port.ipAddress());
- }
+ ports.forEach(port -> {
+ if (port.ipAddress() != null) {
+ kubevirtNetworkAdminService.releaseIp(port.networkId(), port.ipAddress());
+ }
- kubevirtPortAdminService.removePort(port.macAddress());
+ kubevirtPortAdminService.removePort(port.macAddress());
+ });
}
}
}