Support control plane recovery from failure for kubevirt networking
Change-Id: Ic27aa7693d6b4f0c241dc2f3d18d4546e24997d8
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 595b775..d9076da 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
@@ -142,12 +142,65 @@
eventExecutor.execute(() -> processPodDeletion(event.subject()));
break;
case KUBEVIRT_POD_CREATED:
+ eventExecutor.execute(() -> processPodCreation(event.subject()));
+ break;
default:
// do nothing
break;
}
}
+ private void processPodCreation(Pod pod) {
+ if (!isRelevantHelper()) {
+ return;
+ }
+
+ KubernetesClient client = k8sClient(kubevirtApiConfigService);
+
+ if (client == null) {
+ return;
+ }
+
+ Map<String, String> annots = pod.getMetadata().getAnnotations();
+ if (annots == null) {
+ return;
+ }
+
+ if (!annots.containsKey(NETWORK_STATUS_KEY)) {
+ return;
+ }
+
+ try {
+ 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 ips = object.getJSONArray(IPS);
+ if (ips != null && ips.length() > 0) {
+ IpAddress ip = IpAddress.valueOf(ips.getString(0));
+ kubevirtNetworkAdminService.reserveIp(jsonNetwork.networkId(), ip);
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error("Failed to reserve IP address", e);
+ }
+
+ KubevirtPort port = getPort(kubevirtNetworkAdminService.networks(), pod);
+ if (port == null) {
+ return;
+ }
+
+ if (kubevirtPortAdminService.port(port.macAddress()) == null) {
+ kubevirtPortAdminService.createPort(port);
+ }
+ }
+
private void processPodUpdate(Pod pod) {
if (!isRelevantHelper()) {
return;